
--[[
 * @file main.lua
 * @brief 振动传感器数据MQTT上传系统
 * @version 1.2.0
 * @date 2025-05-20
 * @copyright Copyright (c) 2025 飞鸟
 *
]]

PROJECT = "mqtt_upload_vibration_sensor_data_demo"
VERSION = "1.0.0"

-- sys库是标配
_G.sys = require("sys")
--[[特别注意, 使用mqtt库需要下列语句]]
_G.sysplus = require("sysplus")

--根据自己的服务器修改以下参数
local mqtt_host = "broker.emqx.io"
local mqtt_port = 1883
local client_id = "Esp32C3"

--发布，订阅主题
local pub_topic = "ESP32C3/data_send"
local pub_topic_ota = "ESP32C3/ota_device_send"
local sub_topic = "ESP32C3/data_rec"
local sub_topic_ota = "ESP32C3/ota_device_rec"

local qos = 1		--传输质量，1为至少发一次

local LED = gpio.setup(13, 0, gpio.PULLUP)		--led

local uartid = 1 -- 根据实际设备选取不同的uartid

--初始化串口
uart.setup(
    uartid,--串口id
    115200,--波特率
    8,--数据位
    1--停止位
)

--连网
sys.taskInit(function()
	--连网
	local ssid = "kk"
	local password = "88888888"
	log.info("wifi", ssid, password)
	wlan.init()
	--wlan.setMode(wlan.STATION) 		暂时不将自己作为热点
	device_id = wlan.getMac()
	wlan.connect(ssid, password)
end)

--直接CV过来稍微改改就行
--连接mqtt，以及消息处理
sys.taskInit(function()
    -- 连接mqtt
    mqttc = mqtt.create(nil, mqtt_host, mqtt_port)		-- 创建mqtt客户端实例
    mqttc:auth(client_id)  -- 设置客户端ID
    mqttc:autoreconn(true, 3000)  -- 自动重连
	
	--回调函数，拿来主题订阅， 接收消息
    mqttc:on(function(mqtt_client, event, Topic, payload)		--mqtt_client, event, data, payload是这个回调函数返回的参数
		--打印太多了，看的我眼花缭乱，注释一些
        --log.info("mqtt", "event", event, mqtt_client, Topic, payload)
        if event == "conack" then
            -- 联上了
            -- mqtt_client:subscribe(sub_topic)--单主题订阅
            mqtt_client:subscribe({[sub_topic]=1,[sub_topic_ota]=1})--多主题订阅
			
		--接收消息，消息处理
        elseif event == "recv" then
            log.info("收到来自主题：",Topic, "的消息：", payload)
			if payload == "on" then
				LED(1)
				log.info("LED已打开")
			elseif payload == "off" then
				LED(0)
				log.info("LED已关闭")
			end
            uart.write(uartid, payload)
        end
    end)
	
    mqttc:connect()
    
end)

--这里处理串口消息
-- 收取数据会触发回调, 这里的"receive" 是固定值
uart.on(uartid, "receive", function(id, len)
    local s = ""
    repeat
        s = uart.read(id, 4096)
        if #s > 0 then -- #s 是取字符串的长度
		
            -- log.info("uart", "receive", id, #s, s:toHex())

            local SendingData = s

            local pkgid = mqttc:publish(pub_topic, SendingData, qos)

            local pkgid_ = mqttc:publish(pub_topic_ota, SendingData, qos)

            if pkgid and pkgid_ then
                log.info("上报成功")
                log.info(SendingData)
            end
        end
        -- 如使用2024.5.13之前编译的ESP32C3/ESP32S3固件, 恢复下面的代码可以正常工作
        -- if #s == len then
        --     break
        -- end
    until s == ""
end)


sys.run()


